// 正则校验、公共校验
import CryptoJS from 'crypto-js'
import store from '@/store'
export default {
  /**
     * 外部地址
     * @param {string} path
     * @returns {Boolean}
     */
  isExternal: function(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
  },

  /**
     * 有效的URL
     * @param {string} url
     * @returns {Boolean}
     */
  validURL: function(url) {
    const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
    return reg.test(url)
  },

  /**
     * 小写字母
     * @param {string} str
     * @returns {Boolean}
     */
  validLowerCase: function(str) {
    const reg = /^[a-z]+$/
    return reg.test(str)
  },

  /**
     * 大写字母
     * @param {string} str
     * @returns {Boolean}
     */
  validUpperCase: function(str) {
    const reg = /^[A-Z]+$/
    return reg.test(str)
  },

  /**
     * 字母
     * @param {string} str
     * @returns {Boolean}
     */
  validAlphabets: function(str) {
    const reg = /^[A-Za-z]+$/
    return reg.test(str)
  },

  /**
     * 有效邮箱
     * @param {string} email
     * @returns {Boolean}
     */
  validEmail: function(email) {
    const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return reg.test(email)
  },

  /**
     * 字符串
     * @param {string} str
     * @returns {Boolean}
     */
  isString: function(str) {
    if (typeof str === 'string' || str instanceof String) {
      return true
    }
    return false
  },

  /**
     * 数组
     * @param {Array} arg
     * @returns {Boolean}
     */
  isArray: function(arg) {
    if (typeof Array.isArray === 'undefined') {
      return Object.prototype.toString.call(arg) === '[object Array]'
    }
    return Array.isArray(arg)
  },

  /**
     * 手机号
     * @param {string} str
     * @returns {Boolean}
     */
  validPhone: function(str) {
    const reg = /^1[3456789]\d{9}$/
    return reg.test(str)
  },

  /**
     * 手机号和固定电话
     * @param {string} str
     * @returns {Boolean}
     */
  validPhoneOrTele: function(str) {
    const reg = /^((0\d{2,3}-\d{7,8})|(1[3456786]\d{9}))$/
    return reg.test(str)
  },

  /**
     * 6-16位的包含大小写字母、数字、- _
     * @param {string} str
     * @returns {Boolean}
     */
  letterAndNumberLength: function(str) {
    const reg = /^[a-zA-Z0-9_-]{6,16}$/
    return reg.test(str)
  },

  /**
     * 只包含字母和数字
     * @param {string} str
     * @returns {Boolean}
     */
  letterAndNumber: function(str) {
    const reg = /^[a-zA-Z0-9]+$/i
    return reg.test(str)
  },

  /**
     * 正整数
     * @param {string} str
     * @returns {Boolean}
     */
  positiveInteger: function(str) {
    const reg = /^\d+$/
    return reg.test(str)
  },

  /**
     * 负整数
     * @param {string} str
     * @returns {Boolean}
     */
  negativeInteger: function(str) {
    const reg = /^-\d+$/
    return reg.test(str)
  },

  /**
     * 整数
     * @param {string} str
     * @returns {Boolean}
     */
  integer: function(str) {
    const reg = /^-?\d+$/
    return reg.test(str)
  },

  /**
     * 身份证
     * @param {string} str
     * @returns {Boolean}
     */
  validIDCard: function(str) {
    const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    return reg.test(str)
  },

  /**
     * 判空
     * @param {string} str
     * @returns {Boolean}
     */
  isEmpty: function(str) {
    if ((str == '' || str == null || str == undefined || JSON.stringify(str) === '[]' || this.isEmptyObject(str)) && str != 0) {
      return true
    } else {
      return false
    }
  },
  isEmptyObject: function(str) {
    let t
    for (t in str) return false
    return true
  },

  /**
    * ArrayBuffer 转换成base64图片
    * @param {ArrayBuffer} ArrayBuffer
    * @returns {base64 image}
    */
  getBase64Imgae(ArrayBuffer) {
    if (ArrayBuffer) {
      const url = 'data:image/png;base64,' +
                btoa(
                  new Uint8Array(ArrayBuffer).reduce(
                    (ArrayBuffer, byte) => ArrayBuffer + String.fromCharCode(byte),
                    ''
                  )
                )
      return url
    }
    return ''
  },

  /**
     * 只允许点击一次
     * @param {function} func
     */
  onceTrigger(func) {
    let done = false
    return function() {
      if (!done) {
        done = true
        func.apply(this, arguments)
      }
    }
  },

  // DES加密 ab410f8f9a4a42cc7a7f48fc4134e111228we Pkcs7填充方式
  encryptByDES(message, key = 'cf410f8f9a4a42cc7a7f48fc4134e8f9') {
    const keyHex = CryptoJS.enc.Utf8.parse(key)
    const encrypted = CryptoJS.TripleDES.encrypt(message, keyHex, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    })
    return encrypted.toString()
  },

  /**
    * 构造树型结构数据
    * @param {*} data 数据源
    * @param {*} id id字段 默认 'id'
    * @param {*} parentId 父节点字段 默认 'parentId'
    * @param {*} children 孩子节点字段 默认 'children'
    * @param {*} rootId 根Id 默认 0
    */
  handleTree(data, id, parentId, children, rootId) {
    id = id || 'id'
    parentId = parentId || 'parentId'
    children = children || 'children'
    rootId = rootId || Math.min.apply(Math, data.map(item => { return item[parentId] })) || 0
    // 对源数据深度克隆
    const cloneData = JSON.parse(JSON.stringify(data))
    // 循环所有项
    const treeData = cloneData.filter(father => {
      const branchArr = cloneData.filter(child => {
        // 返回每一项的子级数组
        return father[id] === child[parentId]
      })
      branchArr.length > 0 ? father.children = branchArr : ''
      // 返回第一层
      return father[parentId] === rootId
    })
    return treeData != '' ? treeData : data
  },

  /**
     * 判断字符串符合下面格式
     * @param {string} path
     * @returns {Boolean}
     */
  isExternal(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
  },

  /**
     * 校验名称长度（单位字符）
     * @param {*} val 字符串
     * @returns 长度
     */
  getByteLen(val) {
    let len = 0
    for (let i = 0; i < val.length; i++) {
      const a = val.charAt(i)
      if (a.match(/[^\x00-\xff]/ig) != null) {
        len += 2
      } else {
        len += 1
      }
    }
    return len
  },

  /**
     * 不能包含中文
     * @param {string} str
     * @returns {Boolean}
     */
  noChinaText: function(str) {
    const reg = /^[^\u4e00-\u9fa5]+$/
    return reg.test(str)
  },

  /**
     * 搜索过滤
     * @param {*} data   被过滤数据，数组
     * @param {*} field   被过滤字段
     * @param {*} filter   过滤内容
     * @returns
     */
  filterData: function(data, field, filter) {
    const arr = data.filter(item => item[field].indexOf(filter) != -1)
    return arr
  },

  /**
     * 下载Excel
     * @param {*} blob 文件流
     * @param {*} fileName 文件名称
     */
  downFileXLSX(blob, fileName) {
    if (window.navigator.msSaveOrOpenBlob) {
      navigator.msSaveBlob(blob, fileName)
    } else {
      const link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.download = `${fileName}.xlsx`
      link.click()
      window.URL.revokeObjectURL(link.href)
    }
  },

  /**
     * 获取按钮是否有权限
     * @param {*} code 按钮code
     */
  buttonHasAuthority(code) {
    const btnList = store.getters.btnList;
    let has = btnList.includes(code)
    // has = true
    return has
  }
}
